package com.supermarket.main;

import com.supermarket.ui.LoginFrame;
import com.supermarket.util.DatabaseUtil;

import javax.swing.*;
import java.awt.*;

/**
 * 超市管理系统主启动类
 * 应用程序的入口点
 */
public class SupermarketApp {

    /**
     * 应用程序名称
     */
    public static final String APP_NAME = "超市管理系统";

    /**
     * 应用程序版本
     */
    public static final String APP_VERSION = "1.0.0";

    /**
     * 作者信息
     */
    public static final String APP_AUTHOR = "Java作业项目";

    /**
     * 主方法 - 应用程序入口
     * 
     * @param args 命令行参数
     */
    public static void main(String[] args) {
        // 设置系统属性
        setupSystemProperties();

        // 设置外观和感觉
        setupLookAndFeel();

        // 启动应用程序
        SwingUtilities.invokeLater(() -> {
            try {
                startApplication();
            } catch (Exception e) {
                showFatalError("应用程序启动失败", e);
                System.exit(1);
            }
        });
    }

    /**
     * 设置系统属性
     */
    private static void setupSystemProperties() {
        // 设置系统编码为UTF-8
        System.setProperty("file.encoding", "UTF-8");

        // 启用高DPI支持
        System.setProperty("sun.java2d.uiScale", "1.0");

        // 设置字体渲染质量
        System.setProperty("awt.useSystemAAFontSettings", "on");
        System.setProperty("swing.aatext", "true");

        // 输出系统信息（调试用）
        if (isDebugMode()) {
            printSystemInfo();
        }
    }

    /**
     * 设置外观和感觉
     */
    private static void setupLookAndFeel() {
        try {
            // 尝试使用系统外观
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());

            // 设置全局字体
            setGlobalFont(new Font("Microsoft YaHei", Font.PLAIN, 12));

            // 设置UI属性
            setupUIDefaults();

        } catch (Exception e) {
            System.err.println("警告：无法设置系统外观，使用默认外观");
            e.printStackTrace();
        }
    }

    /**
     * 设置UI默认属性
     */
    private static void setupUIDefaults() {
        // 设置表格颜色
        UIManager.put("Table.alternateRowColor", new Color(245, 245, 245));
        UIManager.put("Table.gridColor", new Color(220, 220, 220));

        // 设置按钮样式
        UIManager.put("Button.font", new Font("Microsoft YaHei", Font.PLAIN, 12));

        // 设置对话框标题
        UIManager.put("OptionPane.messageFont", new Font("Microsoft YaHei", Font.PLAIN, 12));
        UIManager.put("OptionPane.buttonFont", new Font("Microsoft YaHei", Font.PLAIN, 12));
    }

    /**
     * 设置全局字体
     * 
     * @param font 字体对象
     */
    private static void setGlobalFont(Font font) {
        java.util.Enumeration<Object> keys = UIManager.getDefaults().keys();
        while (keys.hasMoreElements()) {
            Object key = keys.nextElement();
            Object value = UIManager.get(key);
            if (value instanceof Font) {
                UIManager.put(key, font);
            }
        }
    }

    /**
     * 启动应用程序
     */
    private static void startApplication() {
        // 显示启动画面
        showSplashScreen();

        // 测试数据库连接
        if (!testDatabaseConnection()) {
            showDatabaseError();
            return;
        }

        // 隐藏启动画面，显示登录界面
        SwingUtilities.invokeLater(() -> {
            new LoginFrame().setVisible(true);
        });
    }

    /**
     * 显示启动画面
     */
    private static void showSplashScreen() {
        if (isDebugMode()) {
            return; // 调试模式下跳过启动画面
        }

        try {
            JWindow splash = new JWindow();
            splash.setLayout(new BorderLayout());

            // 创建启动画面内容
            JPanel content = new JPanel(new BorderLayout());
            content.setBackground(new Color(70, 130, 180));
            content.setBorder(BorderFactory.createEmptyBorder(50, 50, 50, 50));

            // 应用标题
            JLabel titleLabel = new JLabel(APP_NAME, JLabel.CENTER);
            titleLabel.setFont(new Font("Microsoft YaHei", Font.BOLD, 24));
            titleLabel.setForeground(Color.WHITE);

            // 版本信息
            JLabel versionLabel = new JLabel("版本 " + APP_VERSION, JLabel.CENTER);
            versionLabel.setFont(new Font("Microsoft YaHei", Font.PLAIN, 14));
            versionLabel.setForeground(new Color(200, 200, 200));

            // 作者信息
            JLabel authorLabel = new JLabel(APP_AUTHOR, JLabel.CENTER);
            authorLabel.setFont(new Font("Microsoft YaHei", Font.PLAIN, 12));
            authorLabel.setForeground(new Color(200, 200, 200));

            // 加载状态
            JLabel statusLabel = new JLabel("正在启动系统...", JLabel.CENTER);
            statusLabel.setFont(new Font("Microsoft YaHei", Font.PLAIN, 12));
            statusLabel.setForeground(Color.WHITE);

            content.add(titleLabel, BorderLayout.NORTH);
            content.add(versionLabel, BorderLayout.CENTER);

            JPanel bottomPanel = new JPanel(new BorderLayout());
            bottomPanel.setOpaque(false);
            bottomPanel.add(authorLabel, BorderLayout.NORTH);
            bottomPanel.add(statusLabel, BorderLayout.SOUTH);
            content.add(bottomPanel, BorderLayout.SOUTH);

            splash.add(content);
            splash.setSize(400, 300);
            splash.setLocationRelativeTo(null);
            splash.setVisible(true);

            // 显示2秒后自动关闭
            Timer timer = new Timer(2000, e -> splash.dispose());
            timer.setRepeats(false);
            timer.start();

        } catch (Exception e) {
            System.err.println("启动画面显示失败: " + e.getMessage());
        }
    }

    /**
     * 测试数据库连接
     * 
     * @return 连接是否成功
     */
    private static boolean testDatabaseConnection() {
        try {
            System.out.println("正在测试数据库连接...");

            boolean connected = DatabaseUtil.testConnection();

            if (connected) {
                System.out.println("数据库连接成功！");
                return true;
            } else {
                System.err.println("数据库连接失败！");
                return false;
            }

        } catch (Exception e) {
            System.err.println("数据库连接测试异常: " + e.getMessage());
            e.printStackTrace();
            return false;
        }
    }

    /**
     * 显示数据库错误对话框
     */
    private static void showDatabaseError() {
        SwingUtilities.invokeLater(() -> {
            String message = "数据库连接失败！\n\n" +
                    "请检查以下配置：\n" +
                    "1. MySQL服务是否已启动\n" +
                    "2. 数据库 'supermarket_management' 是否已创建\n" +
                    "3. config.properties 中的连接参数是否正确\n" +
                    "4. MySQL驱动jar包是否已添加到classpath\n\n" +
                    "详细错误信息请查看控制台输出。";

            JOptionPane.showMessageDialog(null, message,
                    "数据库连接错误",
                    JOptionPane.ERROR_MESSAGE);
        });
    }

    /**
     * 显示致命错误对话框
     * 
     * @param title     错误标题
     * @param exception 异常对象
     */
    private static void showFatalError(String title, Exception exception) {
        SwingUtilities.invokeLater(() -> {
            String message = title + "\n\n" +
                    "错误详情：" + exception.getMessage() + "\n\n" +
                    "请联系技术支持或查看日志文件获取详细信息。";

            JOptionPane.showMessageDialog(null, message,
                    "系统错误",
                    JOptionPane.ERROR_MESSAGE);
        });

        // 打印堆栈跟踪
        exception.printStackTrace();
    }

    /**
     * 判断是否为调试模式
     * 
     * @return 是否为调试模式
     */
    private static boolean isDebugMode() {
        return "true".equalsIgnoreCase(System.getProperty("debug")) ||
                "development".equalsIgnoreCase(System.getProperty("env"));
    }

    /**
     * 打印系统信息（调试用）
     */
    private static void printSystemInfo() {
        System.out.println("========================================");
        System.out.println("超市管理系统启动信息");
        System.out.println("========================================");
        System.out.println("应用名称: " + APP_NAME);
        System.out.println("应用版本: " + APP_VERSION);
        System.out.println("作者: " + APP_AUTHOR);
        System.out.println("Java版本: " + System.getProperty("java.version"));
        System.out.println("Java供应商: " + System.getProperty("java.vendor"));
        System.out.println("操作系统: " + System.getProperty("os.name") + " " + System.getProperty("os.version"));
        System.out.println("系统架构: " + System.getProperty("os.arch"));
        System.out.println("用户目录: " + System.getProperty("user.dir"));
        System.out.println("字符编码: " + System.getProperty("file.encoding"));
        System.out.println("启动时间: " + new java.util.Date());
        System.out.println("========================================");

        // 打印数据库配置信息
        DatabaseUtil.printConfig();
    }

    /**
     * 获取应用程序信息
     * 
     * @return 应用程序信息字符串
     */
    @SuppressWarnings("unused")
    public static String getAppInfo() {
        return String.format("%s v%s\n开发者: %s\nJava运行时: %s",
                APP_NAME, APP_VERSION, APP_AUTHOR,
                System.getProperty("java.version"));
    }

    /**
     * 检查运行环境
     * 
     * @return 环境检查结果
     */
    @SuppressWarnings("unused")
    public static boolean checkEnvironment() {
        try {
            // 检查Java版本
            String javaVersion = System.getProperty("java.version");
            System.out.println("Java版本: " + javaVersion);

            // 检查Swing支持
            if (!GraphicsEnvironment.isHeadless()) {
                System.out.println("图形界面: 支持");
            } else {
                System.err.println("错误: 当前环境不支持图形界面");
                return false;
            }

            // 检查文件权限
            java.io.File currentDir = new java.io.File(".");
            if (!currentDir.canRead() || !currentDir.canWrite()) {
                System.err.println("警告: 当前目录权限不足");
            }

            return true;

        } catch (Exception e) {
            System.err.println("环境检查失败: " + e.getMessage());
            return false;
        }
    }

    /**
     * 优雅关闭应用程序
     */
    public static void shutdown() {
        System.out.println("正在关闭应用程序...");

        // 这里可以添加清理资源的代码
        // 例如：关闭数据库连接池、保存配置等

        System.out.println("应用程序已安全关闭");
        System.exit(0);
    }
}
